#include "Simulacion.h"
#include "Jugador.h"
#include "Defs.h"
#include <iostream>
#include <cstdlib>

using namespace std;

Simulacion::Simulacion(int jugadores)
{	
	this->jugadores=jugadores;
	
	this->semCuaderno = new Semaforo((char*)SEM5, 1);
	//this->cuaderno = new Cuaderno((char*)CUADERNO, TAMANIO_CUADERNO);
	
	sem=new Semaforo((char*)SEM2,1);	//semaforo para el continuar	
	isContinue=new SharedMemory<bool>((char*)SHM2);	//si continua o no 	
	sem->p();
	isContinue->escribir(false);
	sem->v();
}

Simulacion::~ Simulacion()
{
	delete semCuaderno;
	delete cuaderno;
	delete sem;
	delete isContinue;
}

void Simulacion::comenzar(void)
{	pid_t pid;

	sem->p();
	isContinue->escribir(true);
	sem->v();
	
	//creo la banca
	pid=fork(); 
		
	if(pid == 0)
	{
		comenzarBanca();
		exit(0);
	}
	
	//creo los jugadores
	for(int i=0; i<this->jugadores; i++)
	{
		pid=fork(); 	
		if(pid == 0) 	//Un jugador
		{
			comenzarJugador(i);
			exit(0);
		}
	}
}

void Simulacion::finalizar(void)
{	
	sem->p();
	isContinue->escribir(false);
	sem->v();
}

void Simulacion::comenzarBanca(void)
{
	sem->p();
	bool continuar=isContinue->leer();
	sem->v();
			
	while(continuar)
	{	
		cout << "--------Nuevo Juego--------"<< endl;
		sleep(TIEMPO_APUESTA);
		cout<<"*** NO VA MAS!!!!! ***"<<endl;
						
		//Bloqueo
		ruleta.noVaMas();		
		ruleta.verMesaSinBloqueo();				
		
		cout << "Gira Ruleta"<<endl;
		int monto = ruleta.girar();	//obtiene numero ganador				
		escribirCuaderno(monto); //se escribe cuaderno
		
		ruleta.reiniciar();
		
		sleep(3);
		cout << endl;
		cout <<	"*** Hagan sus apuestas!!! ***" << endl;
		//Desbloqueo
		ruleta.haganApuestas();		
		
		sem->p();
		continuar=isContinue->leer();
		sem->v();
	}
}	

void Simulacion::comenzarJugador(int i){
	Jugador jugador(i);

	sem->p();	//Semaforo para controlar acceso a continuar
	bool continuar=isContinue->leer();
	sem->v();
	
	while(continuar)		
	{	
		//tarda en decidir apuesta
		sleep(rndApuesta());		
		int eleccionNumero=jugador.getEleccionNumero();
		int eleccionApuesta=jugador.getEleccionApuesta();		
							
		ruleta.apuesta(eleccionNumero,eleccionApuesta);	
		cout<<"Jugador "<<i<<" apuesta al "<< eleccionNumero <<" ("<<eleccionApuesta<<")"<<endl;
		
		sem->p();
		continuar=isContinue->leer();
		sem->v();
	}
	cout<<"El jugador "<<i<<" se retira del juego"<<endl;
}

int Simulacion::rndApuesta(){
	srand(time(NULL) +getpid());
	return rand()%TIEMPO_PENSAR_APUESTA+1;	
}

void Simulacion::verMesa ()
{	
	ruleta.verMesa();
}


void Simulacion::escribirCuaderno(int monto){
	semCuaderno->p();				
/*	cuaderno->add(monto);
	cout << "Tamaño cuaderno = " << cuaderno->size() << endl;		
*/	semCuaderno->v();
}

void Simulacion::verCuaderno ()
{	
	semCuaderno->p();		
	
/*	cout << "---------------  Cuaderno  ---------------" << endl;	
	cout << "Tamaño cuaderno = " << cuaderno->size() << endl;
	for(int i=0; i< cuaderno->size();i++)
	{
		cout << i <<"- Saldo de jugada= "<< cuaderno->get(i) <<endl;
	}
	cout << "------------------------------------------" << endl;	
*/	
	semCuaderno->v();
}
